package com.yf.repo.modules.qu.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yf.ability.excel.ExportExcel;
import com.yf.ability.excel.ImportExcel;
import com.yf.ability.log.annon.LogInject;
import com.yf.ability.log.enums.LogType;
import com.yf.base.api.annon.DataProtect;
import com.yf.base.api.api.ApiRest;
import com.yf.base.api.api.controller.BaseController;
import com.yf.base.api.api.dto.*;
import com.yf.base.utils.ResourceUtil;
import com.yf.repo.modules.qu.dto.QuDTO;
import com.yf.repo.modules.qu.dto.export.QuExportDTO;
import com.yf.repo.modules.qu.dto.ext.QuDetailDTO;
import com.yf.repo.modules.qu.dto.request.ChapterGroupReqDTO;
import com.yf.repo.modules.qu.dto.request.ChapterJoinReqDTO;
import com.yf.repo.modules.qu.dto.request.LevelSetReqDTO;
import com.yf.repo.modules.qu.dto.request.QuQueryReqDTO;
import com.yf.repo.modules.qu.entity.Qu;
import com.yf.repo.modules.qu.service.QuService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

@Api(tags = {"openAPI问题题目"})
@Log4j2
@RestController
@RequestMapping("/api/openAI/qu/qu")
public class OpenQuController extends BaseController {
    @Autowired
    private QuService baseService;

    @Autowired
    private ExportExcel exportExcel;



    /**
     * 修改内容
     *
     * @param reqDTO
     * @return
     */
    @LogInject(title = "添加或修改试题", logType = LogType.QU)
    @DataProtect(clazz = Qu.class, update = true)
    @ApiOperation(value = "添加或修改")
    @PostMapping("/save")
    public ApiRest<BaseIdRespDTO> save(@RequestBody QuDetailDTO reqDTO) {
        baseService.save(reqDTO);
        return super.success();
    }

    /**
     * 修改内容
     *
     * @param reqDTO
     * @return
     */
    @LogInject(title = "添加或修改试题（Return ID）", logType = LogType.QU)
    @DataProtect(clazz = Qu.class, update = true)
    @ApiOperation(value = "添加或修改(Return ID)")
    @PostMapping("/saveById")
    public ApiRest<String> saveById(@RequestBody QuDetailDTO reqDTO) {
        String id=baseService.saveById(reqDTO);
        return super.success(id);
    }


    /**
     * 批量删除
     *
     * @param reqDTO
     * @return
     */
    @LogInject(title = "批量删除试题", logType = LogType.QU)
    @DataProtect(clazz = Qu.class, delete = true)
    @ApiOperation(value = "批量删除")
    @PostMapping( "/delete")
    public ApiRest edit(@RequestBody BaseIdsReqDTO reqDTO) {
        //根据ID删除
        baseService.delete(reqDTO.getIds());
        return super.success();
    }

    /**
     * 查找详情
     *
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "查找详情")
    @PostMapping("/detail")
    public ApiRest<QuDetailDTO> detail(@RequestBody BaseIdReqDTO reqDTO) {
        QuDetailDTO dto = baseService.detail(reqDTO.getId());
        return super.success(dto);
    }

    /**
     * 查找试题详情，用来训练，去除一些敏感数据
     *
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "查详情用来训练")
    @PostMapping("/detail-for-train")
    public ApiRest<QuDetailDTO> detailForTrain(@RequestBody BaseIdReqDTO reqDTO) {
        QuDetailDTO dto = baseService.detail(reqDTO.getId());
        return super.success(dto);
    }

    /**
     * 分页查找
     *
     * @param reqDTO
     * @return
     */
    @DataProtect(clazz = Qu.class)
    @ApiOperation(value = "分页查找")
    @PostMapping("/paging")
    public ApiRest<IPage<QuDTO>> paging(@RequestBody PagingReqDTO<QuQueryReqDTO> reqDTO) {

        //分页查询并转换
        IPage<QuDTO> page = baseService.paging(reqDTO);
        return super.success(page);
    }

    /**
     * 分页查找包含答案的
     *
     * @param reqDTO
     * @return
     */
    @DataProtect(clazz = Qu.class)
    @ApiOperation(value = "分页查找包含答案的")
    @PostMapping("/paging-with-answer")
    public ApiRest<IPage<QuDetailDTO>> pagingWithAnswer(@RequestBody PagingReqDTO<QuQueryReqDTO> reqDTO) {

        //分页查询并转换
        IPage<QuDetailDTO> page = baseService.pagingWithAnswer(reqDTO);
        return super.success(page);
    }


    /**
     * 根据章节和难度分组查询试题
     *
     * @param reqDTO
     * @return
     */
    @DataProtect(clazz = Qu.class)
    @ApiOperation(value = "根据章节和难度分组查询试题")
    @PostMapping("/list-with-chapter-group")
    public ApiRest<List<QuDetailDTO>> pagingWithAnswer(@RequestBody ChapterGroupReqDTO reqDTO) {

        //分页查询并转换
        List<QuDetailDTO> list = baseService.listWithChapterGroup(reqDTO);
        return super.success(list);
    }


    /**
     * 批量加入到章节
     *
     * @param reqDTO
     * @return
     */
    @LogInject(title = "批量设置试题章节", logType = LogType.QU)
    @ApiOperation(value = "批量加入到章节")
    @PostMapping("/join-chapters")
    public ApiRest joinChapters(@RequestBody ChapterJoinReqDTO reqDTO) {
        baseService.joinChapters(reqDTO);
        return super.success();
    }

    /**
     * 清理章节信息
     *
     * @param reqDTO
     * @return
     */
    @LogInject(title = "批量清理试题章节", logType = LogType.QU)
    @ApiOperation(value = "清理章节信息")
    @PostMapping("/clear-chapters")
    public ApiRest clearChapters(@RequestBody ChapterJoinReqDTO reqDTO) {
        baseService.clearChapters(reqDTO);
        return super.success();
    }

    /**
     * 批量设置难易程度
     *
     * @param reqDTO
     * @return
     */
    @LogInject(title = "批量修改试题难易度", logType = LogType.QU)
    @ApiOperation(value = "批量设置难易程度")
    @PostMapping("/batch-level")
    public ApiRest batchLevel(@RequestBody LevelSetReqDTO reqDTO) {
        baseService.batchLevel(reqDTO);
        return super.success();
    }

    /**
     * 批量迁移题库
     *
     * @param reqDTO
     * @return
     */
    @ApiOperation(value = "批量迁移题库")
    @PostMapping("/batch-repo")
    public ApiRest batchRepo(@RequestBody BaseBatchReqDTO reqDTO) {
        baseService.batchRepo(reqDTO);
        return super.success();
    }


    /**
     * 导出excel文件
     */
    @PostMapping("/export")
    public ApiRest<Object> exportFile(HttpServletResponse response, @RequestBody QuQueryReqDTO reqDTO) {
        List<QuExportDTO> list = baseService.listForExport(reqDTO);

        // 导出数据
        exportExcel.export(response, QuExportDTO.class, "导出的试题", list);
        return super.success();
    }


    /**
     * 导入Excel
     *
     * @param file
     * @return
     */
    @PostMapping("import")
    public ApiRest importFile(@RequestParam("file") MultipartFile file, @RequestParam("repoId") String repoId) {

        // 解析导入源数据
        ImportExcel excel = new ImportExcel(file);
        List<QuExportDTO> list = excel.getDataList(QuExportDTO.class);
        // 导入数据条数
        baseService.importExcel(list, repoId);
        // 导入成功
        return super.success();
    }



    /**
     * 下载导入题目数据模板
     */
    @PostMapping("import/template")
    public ApiRest importFileTemplate(HttpServletResponse response) {
        try {
            ResourceUtil.write(response, "excel/qu_template.xlsx");
            return super.success();
        } catch (Exception e) {
            e.printStackTrace();
            return super.failure("导入模板下载失败！失败信息：" + e.getMessage());
        }

    }
}
